package com.edu.atmSystem;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATMSystem {
    //实现一个ATM系统，其中包括，用户登录，注册，取钱，转账，退出，注销等
    public static void main(String[] args) {
        //系统首页
        Scanner s = new Scanner(System.in);
        //创建一个对象集合，用于收集账户对象
        //一定不能放进死循环里，否则注册好的账户集合会被空集合所覆盖
        ArrayList<Account> accounts = new ArrayList<>();
        while (true) {
            System.out.println("=================欢迎登陆ATM系统==============");
            System.out.println("1、登录账户");
            System.out.println("2、注册账户");
            System.out.println("请您选择下列操作：");
            switch (s.nextInt()){
                case 1:
                    //登录账户
                    login(accounts,s);
                    break;
                case 2:
                    //注册账户
                    registe(accounts,s);
                    break;
                default:
                    System.out.println("您输入的操作错误");
            }
        }
    }

    //注册开户操作
    //将对象集合传过来，在方法里创建一个对象，将生成的属性都封装进对象当中，然后再将对象添加到集合当中
    private static void registe(ArrayList<Account> accounts, Scanner s) {
        System.out.println("=============欢迎进入注册开户操作================");
        //创建一个用户对象，用于后面将注册信息进行封装
        Account account = new Account();
        System.out.println("请您输入用户名：");
        String userName=s.next();
        account.setName(userName);
        while (true) {
            System.out.println("请您输入密码：");
            String mpassword=s.next();
            System.out.println("请您确认密码：");
            String npassword=s.next();
            if(mpassword.equals(npassword)){
                account.setPassword(mpassword);
                break;//密码确认正确，结束循环
            }else{
                System.out.println("您输入的两次密码不一致，请重新操作");
            }
        }
        System.out.println("请您输入当日取现额度：");
        account.setEnbalance(s.nextDouble());

        //生成一个八位的随机的不重复的卡号
        //要生成一个卡号，就要判断是否有重复的卡号存在，这就需要将对象集合中的对象都提取出来，然后再与对象的CardId进行对比
        //接收新的卡号
        String IdCard=getNewIdCard(accounts);
        account.setCardId(IdCard);
        accounts.add(account);//将生成的对象account添加到集合accounts当中去
        System.out.println("尊敬的"+account.getName()+"先生/女士，"+"您的卡号为："+IdCard);
    }

    //生成一个八位的随机的不重复的卡号
    private static String getNewIdCard(ArrayList<Account> account) {
        Random r = new Random();
        //倘若生成的卡号重复，则重新生成随机卡号
        while (true) {
            String ch = "";
            for (int i = 0; i < 8; i++) {
                ch+=r.nextInt(10);
            }
            //根据返回是否为null来判断是否重复，如果为null,则返回新的卡号
            if(getAccountByCarId(ch,account)==null){
                //生成的卡号为新的卡号，可以使用
                return ch;
            }
        }
    }

    //判断卡号是否重复
    //将集合传过来，然后通过比较集合中，对象的CardId来判断是否有重复，有的话就返回对应的账户对象，没有就返回null
    private static Account getAccountByCarId(String ch2, ArrayList<Account> account) {
        for (int i = 0; i < account.size(); i++) {
            Account account2=account.get(i);
            if(account2.getCardId().equals(ch2)){
                return account2;
            }
        }
        return null;//查无此账号
    }

    //登录操作
    private static void login(ArrayList<Account> accounts,Scanner sc) {
        //先检查是否有已生成的卡号存在
        if(accounts.size()==0){
            System.out.println("对不起，系统内尚无卡号存在，请先进行注册！！");
            return;
        }
        while (true) {
            System.out.println("请您输入卡号:");
            String userId=sc.next();
            Account account=getAccountByCarId(userId,accounts);//根据id查询到的用户对象
            if(account!=null){
                System.out.println("请您输入密码：");
                String password=sc.next();
                if(account.getPassword().equals(password)){
                    System.out.println("==========尊敬的"+account.getName()+"先生/女士，欢迎您登录ATM系统=======");
                    showUserCommand(sc,account,accounts);//用户登陆后进行的操作页
                    return;
                }else {
                    System.out.println("对不起，您输入的密码错误，请重新输入：");
                }
            }else{
                System.out.println("您输入的卡号不存在！请重新输入：");
            }
        }
    }

    //用户登陆成功后进行的操作页
    private static void showUserCommand(Scanner sc,Account account,ArrayList<Account> accounts) {
        while (true) {
            System.out.println("请您进行以下需求操作：");
            System.out.println("1、查询账户：");
            System.out.println("2、存款：");
            System.out.println("3、取款：");
            System.out.println("4、转账：");
            System.out.println("5、修改密码：");
            System.out.println("6、退出：");
            System.out.println("7、注销账户：");
            switch (sc.nextInt()){
                case 1:
                    ////查询账户
                    findUserAccount(account);
                    break;
                case 2:
                    //存钱
                    addMoney(account,sc);
                    break;
                case 3:
                    //取钱
                    subMoney(account,sc);
                    break;
                case 4:
                    //转账
                    changeMoney(account,sc,accounts);
                    break;
                case 5:
                    //修改密码
                    if(changePassword(account,sc)==1){
                        return;
                    }
                    break;
                case 6:
                    //退出账户
                    System.out.println("用户退出成功~欢迎下次使用！！！");
                    return;
                case 7:
                    //注销账户
                    if(deleteAccount(accounts,account,sc)==1){
                        return;
                    }
                    break;
                default:
                    System.out.println("您输入的操作有误，请重新输入！！");
            }
        }
    }

    //销户功能操作
    private static int deleteAccount(ArrayList<Account> accounts,Account account,Scanner sc) {
        System.out.println("您确定要销户吗？？是/任意键");
        String comm=sc.next();
        if(comm.equals("是")){
            accounts.remove(account);//销户
            System.out.println("该用户已成功销户~");
            return 1;
        }else
            System.out.println("当前用户仍保留");
            return 0;//结束销户操作
    }

    //修改密码功能操作
    private static int changePassword(Account account, Scanner sc) {
        System.out.println("==============欢迎进入用户修改密码界面============");
        System.out.println("请您输入当前密码：");
        if(account.getPassword().equals(sc.next())){
            while (true) {
                System.out.println("请输入您新的密码：");
                String newpassword=sc.next();
                if(account.getPassword().equals(newpassword)){
                    System.out.println("对不起，所要修改的密码不能与原密码相同！！");
                    continue;
                }else{
                    System.out.println("请确认您的密码：");
                    String okpassword=sc.next();
                    if(newpassword.equals(okpassword)){
                        account.setPassword(newpassword);
                        System.out.println("密码修改成功!!!");
                        return 1;
                    }else{
                        System.out.println("对不起，两次输入密码不一致！！");
                    }
                }
            }
        }
        else
            System.out.println("您输入的当前密码错误！！！");
        return 0;
    }

    //转账功能操作
    private static void changeMoney(Account account, Scanner sc, ArrayList<Account> accounts) {
        System.out.println("==============欢迎进入用户转账界面============");
        if(accounts.size()<2){
            System.out.println("对不起，当前系统用户不足两位，请先去注册！！");
            return;
        }
        if(account.getBalance()==0){
            System.out.println("对不起，您目前的余额为"+account.getBalance()+"元钱，请先存钱吧！");
            return;
        }
        //输入卡号
        while (true) {
            System.out.println("请您输入所要转账的卡号：");
            String Id=sc.next();
            if(getAccountByCarId(Id,accounts)==null){
                System.out.println("对不起，您输入的卡号不存在！！！");
            }else if(getAccountByCarId(Id,accounts).getCardId().equals(account.getCardId())){
                System.out.println("对不起，您不能向自己转账！！！请重新输入卡号：");
                continue;//结束本次执行，开始下次执行，即重新输入卡号
            }else{
                String userName = "*" + getAccountByCarId(Id, accounts).getName().substring(1);//截取第二个字符到最后的字符
                System.out.println("请输入您所转账的用户[" + userName + "]的姓氏，确认转账！！");
                if (getAccountByCarId(Id, accounts).getName().startsWith(sc.next())) {
                    while (true) {
                        System.out.println("请您输入所要转账的金额：");
                        double money = sc.nextDouble();//转账的金额
                        if (account.getBalance() > money) {
                            account.setBalance(account.getBalance() - money);
                            getAccountByCarId(Id, accounts).setBalance(getAccountByCarId(Id, accounts).getBalance() + money);
                            System.out.println("转账成功！！您当前的余额为" + account.getBalance());
                            return;
                        } else {
                            System.out.println("对不起，您的余额不足，当前余额为" + account.getBalance() + "元钱！！");
                        }
                    }
                }
                else{
                    System.out.println("对不起，您输入的信息有误！！！");
                }
            }
        }
    }

    //取钱功能操作
    private static void subMoney(Account account, Scanner sc) {
        System.out.println("==============欢迎进入用户存款界面============");
        while (true) {
            System.out.println("请您输入要取款的金额：");
            double money=sc.nextDouble();
            if(account.getEnbalance()<money){
                System.out.println("您所取金额大于当次限额!!! 每次最多能取"+account.getEnbalance()+"元钱！！");
            }else if(account.getBalance()<money){
                System.out.println("对不起，您当前余额不足！！！您当前余额为"+account.getBalance()+"元钱！！！");
            }else{
                account.setBalance(account.getBalance()-money);
                System.out.println("取款成功，当前个人信息如下：");
                findUserAccount(account);
                return;//直接干掉取钱方法
            }
        }
    }

    //存钱功能操作
    private static void addMoney(Account account, Scanner sc) {
        System.out.println("==============欢迎进入用户存款界面============");
        System.out.println("请您输入要存款的金额：");
        double money=account.getBalance();//存之前的余额
        account.setBalance(money+sc.nextDouble());
        System.out.println("存款成功，当前个人信息如下");
        findUserAccount(account);
    }
    //查看当前用户详情操作
    private static void findUserAccount(Account account) {
        System.out.println("==============当前登录的用户详情如下============");
        System.out.println("用户卡号："+account.getCardId());
        System.out.println("用户姓名："+account.getName());
        System.out.println("用户密码："+account.getPassword());
        System.out.println("用户余额："+account.getBalance());
        System.out.println("用户限额："+account.getEnbalance());
    }
}
